昨天讓kubernetes上的各項監控數據順利的統一到grafana上,今天就來把服務的log統一集中吧。
關於k8s要如何搜集log主要方法有兩種,一是透過sidecar的方式將pod log轉發出來,二是利用container會在host上寫log的原理用daemonset的pod去搜集log;我今天會用daemonset的做法介紹vector這項專案,並透過vector將log送到loki並在grafana上查詢。
由於這個架構物件比較多一些,畫了一張架構圖來表示彼此之間的關係
架構說明
每個node上有一個daemonset的vector agent搜集metric和log,metric會送到外部的屬於這座cluster的vector進行處理,再由grafana搜集呈現出來;log則是送到屬於這座cluster的kafka做緩送及持久化儲存,再由一座統一管理的vector收下來進行parser及transform的變化依據需求轉送到外部儲存,集中的log會送一份到loki上並存到minio儲存,另外透過grafana指定loki為datasource,這樣就可以藉由grafana介面統一查詢所有cluster的log了。
那麼就先從最基本的daemonset vector agent開始配置,簡易的做法是透過helm安裝
添加helm的repo庫
helm repo add timberio https://packages.timber.io/helm/latest
編輯vector要使用的value
cat <<-'VALUES' > values.yaml
# The Vector Kubernetes integration automatically defines a
# kubernetes_logs source that is made available to you.
# You do not need to define a log source.
sinks:
# Adjust as necessary. By default we use the console sink
# to print all data. This allows you to see Vector working.
# /docs/reference/sinks/
stdout:
type: console
inputs: ["kubernetes_logs"]
target: "stdout"
encoding: "json"
VALUES
安裝
helm install vector timberio/vector-agent \
--namespace vector \
--create-namespace \
--values values.yaml
安裝完成後可以發現多了一個叫vector的namespace,並且有一個daemonset在每個node上部署了vector agent,另外也可以觀察到vector的namespace內有一個configmap,vector agent就會依據這個configmap的內容去取得他的資料來源(metric、log);在完成ds的配置後,因為要讓外部的vector能夠取得metric資訊,可以將daemonset設定hostnetwork為true,這樣就會在每個node上暴露9090port給外部的vector存取囉。